%practica

%Ejercicio 2
%natural(-X)

natural(cero).
natural(suc(X)) :- natural(X).

%moi(-X, +Y)
moi(cero,_).
moi(suc(X),suc(Y)) :- moi(X,Y).

%suma(+X, +Y, -Z)
suma(cero,Y,Y).
suma(suc(X),Y,suc(Z)) :- suma(X,Y,Z).

%producto(+X, +Y,-Z)
producto(cero,_,cero).
producto(suc(X),Y,Z) :- suma(H,Y,Z), producto(X,Y,H).

%listas

%append(+L,+X,-L1)
append([],X,[X]).
append([H | T], Y, [H | Z]) :- append(T,Y,Z).

%drop(+L,-L1)
drop([_],[]).
drop([X|Xs],[X|Ys]) :- drop(Xs,Ys).

last2([X],X).
last2([_|Xs],Y) :- last2(Xs,Y).

%palidromo(+L,-L1)
palindromo([],[]).
palindromo([X|Xs],[X|Ys]) :- palindromo(Xs,Zs), append(Zs,X,Ys).

%doble(+L,-L1)
doble([],[]).
doble([X|Xs],[X,X|Ys]) :- doble(Xs,Ys).

%arboles

%raiz(+T,-X)
raiz(bin(_,X,_),X).

%aBB(+T)
aBB(nil).
aBB(bin(nil,_,nil)) :- !.
aBB(bin(I,X,D)) :- I \= nil, D \= nil, raiz(D,Rd), raiz(I,Ri), Rd > X, not(Ri > X), aBB(D), aBB(I).

%aBBInsert(+X,+T1,-T2)
aBBinsert(X,nil,bin(nil,X,nil)).
aBBinsert(X,bin(I,Y,D),bin(I2,Y,D)) :- not(X > Y), aBBinsert(X,I,I2).
aBBinsert(X,bin(I,Y,D),bin(I,Y,D2)) :- X > Y, aBBinsert(X,D,D2).

%ramas(+AB,-Ramas) test >> ramas(bin(bin(nil,1,nil),2,bin(nil,5,nil)),L) = [[2,1],[2,5]].
ramas(Ab,Ramas) :- bagof(L,rama(Ab,L),Ramas).

%rama(+AB,-L)
rama(nil,[]).
rama(bin(nil,X,nil),[X]).
rama(bin(nil,X,D),[X|Xs]) :- D \= nil, rama(D,Xs).
rama(bin(I,X,nil),[X|Xs]) :- I \= nil, rama(I,Xs).
rama(bin(I,X,D),[X|Xs]) :- I \= nil, D \= nil, rama(I,Xs).
rama(bin(I,X,D),[X|Xs]) :- I \= nil, D \= nil, rama(D,Xs).

